package cn.detu.ln.service.impl;

import cn.detu.ln.entity.Grade;
import cn.detu.ln.mapper.GradeMapper;
import cn.detu.ln.service.GradeService;
import cn.detu.ln.utils.RestUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.expression.spel.ast.Selection;
import org.springframework.stereotype.Service;

import java.util.HashMap;

@Service
public class GradeServiceImpl implements GradeService {
    @Autowired
    private GradeMapper gradeMapper;
    @Override
    public RestUtil selectAll() {
        return new RestUtil(200,"",gradeMapper.selectList(null));
    }

    @Override
    public RestUtil queryGradeByStuNumPage(Integer current, Integer rows, String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Grade> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Grade>().eq("stu_num",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Grade> gradePage = gradeMapper.selectPage(new Page<Grade>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",gradePage.getTotal());// 总条数
        map.put("pages",gradePage.getPages());// 总页数
        map.put("grades",gradePage.getRecords());// 当前页数据
        return gradePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil queryGradeByGradeYearPage(Integer current, Integer rows, Long stuNum,String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        // 查询学号为某个值并且学年为某个值的模糊查询
        QueryWrapper<Grade> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Grade>().eq("stu_num",stuNum).eq("grade_year",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Grade> gradePage = gradeMapper.selectPage(new Page<Grade>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",gradePage.getTotal());// 总条数
        map.put("pages",gradePage.getPages());// 总页数
        map.put("grades",gradePage.getRecords());// 当前页数据
        return gradePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil queryGradeByCouNaturePage(Integer current, Integer rows, Long stuNum,String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Grade> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Grade>().eq("stu_num",stuNum).like("cou_nature",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Grade> gradePage = gradeMapper.selectPage(new Page<Grade>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",gradePage.getTotal());// 总条数
        map.put("pages",gradePage.getPages());// 总页数
        map.put("grades",gradePage.getRecords());// 当前页数据
        return gradePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil gradeDelete(Integer gradeId) {
        return gradeMapper.deleteById(gradeId)>0?new RestUtil(200,"删除成功！",null):new RestUtil(500,"删除失败",null);
    }

    @Override
    public RestUtil gradeUpdate(Grade grade) {
        return gradeMapper.updateById(grade)>0?new RestUtil(200,"修改成功！",null):new RestUtil(500,"修改失败",null);
    }

    @Override
    // 课程名称 + 学号
    public RestUtil gradeCourseStu(Integer current, Integer rows, String search,Long stuNum) {
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Grade> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Grade>().eq("stu_num",stuNum).like("cou_name",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Grade> gradePage = gradeMapper.selectPage(new Page<Grade>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",gradePage.getTotal());// 总条数
        map.put("pages",gradePage.getPages());// 总页数
        map.put("grades",gradePage.getRecords());// 当前页数据
        return gradePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil gradeInsert(Grade grade) {
        return gradeMapper.insert(grade)>0?new RestUtil(200,"录入成功！",null):new RestUtil(500,"添加失败",null);
    }

    @Override
    public RestUtil queryGradeByTeaCourse(Integer current, Integer rows, String search) {
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Grade> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Grade>().like("cou_name",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Grade> gradePage = gradeMapper.selectPage(new Page<Grade>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",gradePage.getTotal());// 总条数
        map.put("pages",gradePage.getPages());// 总页数
        map.put("grades",gradePage.getRecords());// 当前页数据
        return gradePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil queryGradeByPage(Integer current, Integer rows,Long stuNum, String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Grade> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Grade>().eq("stu_num",stuNum).like("cou_name",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Grade> gradePage = gradeMapper.selectPage(new Page<Grade>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",gradePage.getTotal());// 总条数
        map.put("pages",gradePage.getPages());// 总页数
        map.put("grades",gradePage.getRecords());// 当前页数据
        return gradePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil judgeGradeByCouId(Integer couId) {
        Grade grade = gradeMapper.selectOne(new QueryWrapper<Grade>().eq("cou_id",couId));
        if(grade == null) return new RestUtil(200,"老师，您还未录入成绩，请录入学生成绩后在查看！！！",null);
        return new RestUtil(500,"已经录入成绩！！！",null);
    }

    @Override
    public RestUtil selectGradeCouNameByAdmin(Integer current, Integer rows, String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Grade> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Grade>().like("cou_name",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Grade> gradePage = gradeMapper.selectPage(new Page<Grade>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",gradePage.getTotal());// 总条数
        map.put("pages",gradePage.getPages());// 总页数
        map.put("grades",gradePage.getRecords());// 当前页数据
        return gradePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil selectGradeCouNatureByAdmin(Integer current, Integer rows, String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Grade> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Grade>().like("cou_nature",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Grade> gradePage = gradeMapper.selectPage(new Page<Grade>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",gradePage.getTotal());// 总条数
        map.put("pages",gradePage.getPages());// 总页数
        map.put("grades",gradePage.getRecords());// 当前页数据
        return gradePage != null ? new RestUtil(200,"",map) : null;
    }
}
